home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 49 / Amiga Format CD49 (2000-01-17)(Future Publishing)(GB)(Track 1 of 3)[!][issue 2000-02].iso / -serious- / programming / e / lsestuff / smartlist.e < prev    next >
Text File  |  1999-11-29  |  2KB  |  98 lines

  1. OPT MODULE
  2.  
  3. MODULE '*xli'
  4.  
  5. CONST MAX_SUBLIST_NODES=100
  6.  
  7. OBJECT sublist OF xli
  8. ENDOBJECT
  9.  
  10. OBJECT mainlist OF xli
  11. ENDOBJECT
  12.  
  13. EXPORT OBJECT smartList OF xni
  14.    PRIVATE
  15.    ml:PTR TO mainlist
  16. ENDOBJECT
  17.  
  18. PROC oAdd(node:PTR TO xni, id=NIL) OF smartList
  19.    DEF sl:PTR TO sublist
  20.    DEF slnum
  21.    IF id THEN node.id := id
  22.    slnum := node.id / MAX_SUBLIST_NODES
  23.    sl := self.ml.find(slnum)
  24.    IF sl = NIL
  25.       NEW sl
  26.       sl.id := slnum
  27.       self.ml.ordInsert(sl)
  28.    ENDIF
  29.    sl.ordInsert(node)
  30. ENDPROC node
  31.  
  32. PROC add(node:PTR TO xni, id=NIL) OF smartList
  33.    DEF sl:PTR TO sublist
  34.    DEF slnum
  35.    IF id THEN node.id := id
  36.    slnum := node.id / MAX_SUBLIST_NODES
  37.    sl := self.ml.find(slnum)
  38.    IF sl = NIL
  39.       NEW sl
  40.       sl.id := slnum
  41.       self.ml.addLast(sl)
  42.    ENDIF
  43.    sl.addLast(node)
  44. ENDPROC node
  45.  
  46. PROC rem(node:PTR TO xni) OF smartList
  47.    DEF sl:PTR TO sublist
  48.    DEF slnum
  49.    slnum := node.id / MAX_SUBLIST_NODES
  50.    sl := self.ml.find(slnum)
  51.    IF sl = NIL THEN RETURN NIL
  52.    sl.remove(node)
  53.    IF sl.count() = NIL
  54.       self.ml.remove(sl)
  55.       END sl
  56.    ENDIF
  57. ENDPROC node
  58.  
  59. PROC first() OF smartList
  60.    DEF sl:PTR TO sublist
  61.    sl := self.ml.first()
  62. ENDPROC sl.first()
  63.  
  64. PROC last() OF smartList
  65.    DEF sl:PTR TO sublist
  66.    sl := self.ml.last()
  67. ENDPROC sl.last()
  68.  
  69. /* must use theese ! */
  70. PROC next(node:PTR TO xni) OF smartList
  71.    DEF sl:PTR TO sublist
  72.    DEF slnum
  73.    IF node.next THEN RETURN node.next
  74.    slnum := node.id / MAX_SUBLIST_NODES
  75.    sl := self.ml.find(slnum)
  76.    sl := sl.next
  77.    IF sl = NIL THEN RETURN NIL
  78. ENDPROC sl.first()
  79.  
  80. PROC prev(node:PTR TO xni) OF smartList
  81.    DEF sl:PTR TO sublist
  82.    DEF slnum
  83.    IF node.prev THEN RETURN node.prev
  84.    slnum := node.id / MAX_SUBLIST_NODES
  85.    sl := self.ml.find(slnum)
  86.    sl := sl.prev
  87.    IF sl = NIL THEN RETURN NIL
  88. ENDPROC sl.last()
  89.  
  90. PROC find(id) OF smartList
  91.    DEF sl:PTR TO sublist
  92.    DEF slnum
  93.    slnum := id / MAX_SUBLIST_NODES
  94.    sl := self.ml.find(slnum)
  95.    IF sl = NIL THEN RETURN NIL
  96. ENDPROC sl.find(id)
  97.  
  98.